import 'dart:io';
import 'package:path/path.dart' as p;

import '../../../../../../shared/widgets/file_explorer/file_node.dart';

/// 将一个 [Directory] 转换为 **懒加载** 的 [FileNode]。
///
/// - 根节点为目录，子节点在展开时才真正调用 `list()` 加载，避免一次性递归全量扫描；
/// - 子节点排序规则：
///   1. 文件夹在前，文件在后；
///   2. 同类节点按名称字母序排列（不区分大小写）；
/// - 子目录会递归使用 [directoryToLazyNode]，支持无限深度懒加载。
///
/// 常用于文件管理器/工程浏览器等场景。
FileNode directoryToLazyNode(Directory dir) {
  final name = p.basename(dir.path);

  return FileNode(
    name,
    isFolder: true,

    // 懒加载：只有展开时才执行
    loader: () async {
      // 列出当前目录下的直接子项（不递归，不跟随软链接）
      final entities =
      await dir.list(recursive: false, followLinks: false).toList();

      // 排序：目录在前，文件在后；同类按字母序
      entities.sort((a, b) {
        final aIsDir = a is Directory;
        final bIsDir = b is Directory;
        if (aIsDir != bIsDir) return aIsDir ? -1 : 1;
        return p
            .basename(a.path)
            .toLowerCase()
            .compareTo(p.basename(b.path).toLowerCase());
      });

      // 转换为 FileNode 列表
      return entities.map<FileNode>((e) {
        final base = p.basename(e.path);

        if (e is Directory) {
          // 子目录 -> 懒加载节点
          return FileNode(
            base,
            isFolder: true,
            loader: () async {
              final childDir = Directory(e.path);
              final children = await childDir
                  .list(recursive: false, followLinks: false)
                  .toList();

              // 排序规则同上
              children.sort((a, b) {
                final aIsDir = a is Directory;
                final bIsDir = b is Directory;
                if (aIsDir != bIsDir) return aIsDir ? -1 : 1;
                return p
                    .basename(a.path)
                    .toLowerCase()
                    .compareTo(p.basename(b.path).toLowerCase());
              });

              // 子目录节点也继续递归懒加载
              return children.map<FileNode>((c) {
                final cb = p.basename(c.path);
                if (c is Directory) {
                  return directoryToLazyNode(Directory(c.path));
                } else {
                  return FileNode(cb, isFolder: false);
                }
              }).toList(growable: false);
            },
          );
        } else {
          // 文件节点
          return FileNode(base, isFolder: false);
        }
      }).toList(growable: false);
    },
  );
}
